import {
    login,
    logout,
    getInfo
} from '@/api/user'
import {
    getToken,
    setToken,
    removeToken
} from '@/utils/auth'
import router, {
    resetRouter
} from '@/router'

const state = {
    token: getToken(),
    name: '',
    avatar: '',
    introduction: '',
    roles: []
}

const mutations = {
    SET_TOKEN: (state, token) => {
        state.token = token
    },
    SET_INTRODUCTION: (state, introduction) => {
        state.introduction = introduction
    },
    SET_NAME: (state, name) => {
        state.name = name
    },
    SET_AVATAR: (state, avatar) => {
        state.avatar = avatar
    },
    SET_ROLES: (state, roles) => {
        state.roles = roles
    }
}

const actions = {
    // user login
    login({
        commit
    }, userInfo) {
        const {
            user,
            password
        } = userInfo
        return new Promise((resolve, reject) => {
            // // 测试用，最后要去除
            localStorage.setItem("user_info", '{ "id": 1, "status": 1, "username": "admin", "name": "管理员", "avatar": "https://img1.baidu.com/it/u=1113706798,1599563880&fm=26&fmt=auto&gp=0.jpg", "created_at": "2020-11-10 09:13:14", "role_id_ele": 1, "email": "123456789@qq.com" }');
            localStorage.setItem("expire_time", 360000000000000000);
            login({
                user: user.trim(),
                password: password
            }).then(response => {
                commit('SET_TOKEN', response.token)
                setToken(response.token)
                resolve()
            }).catch(error => {
                reject(error)
            })
        })
    },

    // get user info
    getInfo({
        commit,
        state
    }) {
        return new Promise((resolve, reject) => {
            let data = localStorage.getItem("user_info");
            if (data) {
                let user_info = JSON.parse(localStorage.getItem("user_info"));
                let roles = ["admin"];
                // roles.push(user_info.username);
                commit('SET_ROLES', roles)
                commit('SET_NAME', user_info.name)
                commit('SET_AVATAR', user_info.avatar)
                    // commit('SET_INTRODUCTION', "lalala")
                user_info["roles"] = roles;
                // user_info["introduction"] = 'lalala';
                resolve(user_info)
            } else {
                reject('登录失败，请重新尝试')
            }
            // return false;
            // getInfo(state.token).then(response => {
            // 	const {
            // 		data
            // 	} = response

            // 	if (!data) {
            // 		reject('Verification failed, please Login again.')
            // 	}

            // 	const {
            // 		roles,
            // 		name,
            // 		avatar,
            // 		introduction
            // 	} = data

            // 	// roles must be a non-empty array
            // 	if (!roles || roles.length <= 0) {
            // 		reject('getInfo: roles must be a non-null array!')
            // 	}

            // 	// commit('SET_ROLES', roles)
            // 	// commit('SET_NAME', name)
            // 	// commit('SET_AVATAR', avatar)
            // 	// commit('SET_INTRODUCTION', introduction)
            // 	resolve(data)
            // }).catch(error => {
            // 	reject(error)
            // })
        })
    },

    // user logout
    logout({
        commit,
        state,
        dispatch
    }) {
        return new Promise((resolve, reject) => {
            logout(state.token).then(() => {
                commit('SET_TOKEN', '')
                commit('SET_ROLES', [])
                removeToken()
                resetRouter()

                // reset visited views and cached views
                // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
                dispatch('tagsView/delAllViews', null, {
                    root: true
                })

                resolve()
            }).catch(error => {
                reject(error)
            })
        })
    },

    // remove token
    resetToken({
        commit
    }) {
        return new Promise(resolve => {
            commit('SET_TOKEN', '')
            commit('SET_ROLES', [])
            removeToken()
            resolve()
        })
    },

    // dynamically modify permissions
    async changeRoles({
        commit,
        dispatch
    }, role) {
        const token = role + '-token'

        commit('SET_TOKEN', token)
        setToken(token)

        const {
            roles
        } = await dispatch('getInfo')

        resetRouter()

        // generate accessible routes map based on roles
        const accessRoutes = await dispatch('permission/generateRoutes', roles, {
                root: true
            })
            // dynamically add accessible routes
        router.addRoutes(accessRoutes)

        // reset visited views and cached views
        dispatch('tagsView/delAllViews', null, {
            root: true
        })
    }
}

export default {
    namespaced: true,
    state,
    mutations,
    actions
}